import pygame
from settings import *
from tile import Tile
from player import Player
from support import *
from random import choice
from weapon import Weapon
from ui import UI
from monster import Monster
from particles import AnimationPlayer
from magic import MagicPlayer
from upgrade import Upgrade


class Level:
    def __init__(self):

        self.游戏窗口 = pygame.display.get_surface()
        self.游戏暂停 = False

        # 精灵组设置
        self.可见精灵组 = YSortCameraGroup()
        self.障碍精灵组 = pygame.sprite.Group()

        # 攻击精灵组设置
        self.选中的武器 = None
        self.攻击精灵组 = pygame.sprite.Group()
        self.可攻击精灵组 = pygame.sprite.Group()

        self.创建地图()

        self.ui = UI()
        self.升级 = Upgrade(self.player)

        self.animation_player = AnimationPlayer()
        self.magic_player = MagicPlayer(self.animation_player)

    def 创建地图(self):
        布局字典 = {
            'boundary': 导入布局('../map/map_FloorBlocks.csv'),
            'grass': 导入布局('../map/map_Grass.csv'),
            'object': 导入布局('../map/map_Objects.csv'),
            'entities': 导入布局('../map/map_Entities.csv')
        }
        视图字典 = {
            'grass': 导入视图('../graphics/Grass'),
            'objects': 导入视图('../graphics/objects')
        }

        for 样式, 布局 in 布局字典.items():
            for 行索引, 行 in enumerate(布局):
                for 单元格列索, 单元格 in enumerate(行):
                    if 单元格 != '-1':
                        x = 单元格列索 * TILESIZE
                        y = 行索引 * TILESIZE
                        if 样式 == 'boundary':
                            Tile((x, y), [self.障碍精灵组], 'invisible')
                        if 样式 == 'grass':
                            随机小草视图 = choice(视图字典['grass'])
                            Tile((x, y), [self.可见精灵组, self.障碍精灵组, self.可攻击精灵组], '小草', 随机小草视图)
                        if 样式 == 'object':
                            对象视图 = 视图字典['objects'][int(单元格)]
                            Tile((x, y), [self.可见精灵组, self.障碍精灵组], 'object', 对象视图)
                        if 样式 == 'entities':
                            if 单元格 == '394':
                                self.player = Player((2000, 1430),
                                                     [self.可见精灵组],
                                                     self.障碍精灵组,
                                                     self.绘制武器,
                                                     self.销毁武器,
                                                     self.使用魔法)
                            else:
                                if 单元格 == '390':
                                    妖怪名 = 'bamboo'
                                elif 单元格 == '391':
                                    妖怪名 = 'spirit'
                                elif 单元格 == '392':
                                    妖怪名 = 'raccoon'
                                else:
                                    妖怪名 = 'squid'
                                Monster(妖怪名, (x, y), [self.可见精灵组,self.可攻击精灵组],
                                        self.障碍精灵组,
                                        self.玩家受伤, self.死亡, self.增加经验值)

    def 绘制武器(self):
        self.选中的武器 = Weapon(self.player, [self.可见精灵组, self.攻击精灵组])

    def 销毁武器(self):
        if self.选中的武器:
            self.选中的武器.kill()
        self.选中的武器 = None

    def 使用魔法(self):
        pass

    def 玩家攻击逻辑(self):
        if self.攻击精灵组:
            for 攻击精灵 in self.攻击精灵组:
                攻击范围中的精灵 = pygame.sprite.spritecollide(攻击精灵, self.可攻击精灵组, False)
                if 攻击范围中的精灵:
                    for 目标精灵 in 攻击范围中的精灵:
                        if 目标精灵.精灵类型 == '小草':
                            目标精灵.kill()
                        else:
                            目标精灵.受到伤害(self.player, 攻击精灵.攻击类型)

    def 玩家受伤(self, 伤害量, 攻击类型):
        if self.player.是否可以收到伤害:
            self.player.血 -= 伤害量
            self.player.是否可以收到伤害 = False
            self.player.伤害开始时间 = pygame.time.get_ticks()

    def 死亡(self, 位置, 死亡动画):
        self.animation_player.创建动画特效(死亡动画, 位置, self.可见精灵组)

    def 增加经验值(self, 数值):
        self.player.经验 += 数值

    def run(self):
        self.可见精灵组.自定义绘制(self.player)
        self.可见精灵组.update()
        self.可见精灵组.怪物自定义更新(self.player)
        self.玩家攻击逻辑()
        self.ui.展示(self.player)


class YSortCameraGroup(pygame.sprite.Group):
    def __init__(self):
        super().__init__()
        self.游戏窗口 = pygame.display.get_surface()
        self.半宽 = self.游戏窗口.get_size()[0] // 2
        self.半高 = self.游戏窗口.get_size()[1] // 2
        self.偏移量 = pygame.math.Vector2()

        # 创建背景
        self.背景视图 = pygame.image.load('../graphics/tilemap/ground.png')
        self.背景区域 = self.背景视图.get_rect(topleft=(0, 0))

    def 自定义绘制(self, player):
        # 设置偏移量
        self.偏移量.x = player.rect.centerx - self.半宽
        self.偏移量.y = player.rect.centery - self.半高

        # 绘制地板
        背景偏移量 = self.背景区域.topleft - self.偏移量
        self.游戏窗口.blit(self.背景视图, 背景偏移量)

        # 绘制精灵
        for 精灵 in (sorted(self.sprites(), key=lambda sprite: sprite.rect.centery)):
            偏移后位置 = 精灵.rect.topleft - self.偏移量
            self.游戏窗口.blit(精灵.image, 偏移后位置)

    def 怪物自定义更新(self, player):
        怪物精灵 = [sprite for sprite in self.sprites() if hasattr(sprite, '精灵类型') and sprite.精灵类型 == '怪物']
        for 怪物 in 怪物精灵:
            怪物.怪物更新(player)
